<li>memory: int, required. Domain memory in MB.
<li>cpu: int, optional. Cpu to run on.
<li>image: linux | netbsd | ..., required. Domain image (OS-specific element).
- <li>controller: any device controller type, optional, default none.
+ <li>backend: any backend device type, optional, default none.
<li>device: any device type, optional, repeats. Device.
<li>restart: string, optional, default onreboot. Restart mode, one of
<ul><li>onreboot: restart the domain when it exits with code reboot.
<h2>(backend (netif)) element</h2>
The vm is a net device backend.
-The domain may not have virtual network interfaces (vifs) configured.
+The vm may not have virtual network interfaces (vifs) configured.
+
+<h2>(backend (vbd) element</h2>
+Defines the domain to use as the backend for virtual block devices.
+The domain must exist.
+<ul>
+ <li>domain: string, required. Domain name or id.
+</ul>
+
+<h2>(backend (vif) element</h2>
+Defines the domain to use as the backend for virtual network interfaces.
+The domain must exist.
+<ul>
+ <li>dom: string, required. Domain name or id.
+</ul>
<h2>(device (vif)) element</h2>
Defines a virtual network interface.
STATE_VM_OK = "ok"
STATE_VM_TERMINATED = "terminated"
+
+def domain_exists(name):
+ # See comment in XendDomain constructor.
+ xd = get_component('xen.xend.XendDomain')
+ return xd.domain_exists(name)
+
def shutdown_reason(code):
"""Get a shutdown reason from a code.
segments = None
return segments
-def make_disk(dom, uname, dev, mode, recreate=0):
+def make_disk(vm, uname, dev, mode, recreate=0):
"""Create a virtual disk device for a domain.
- @param dom: domain id
+ @param vm: vm
@param uname: device to export
@param dev: device name in domain
@param mode: read/write mode
raise VmError("vbd: Multi-segment vdisk: uname=%s" % uname)
segment = segments[0]
vdev = blkdev_name_to_number(dev)
- ctrl = xend.blkif_create(dom, recreate=recreate)
+ backend = vm.get_device_backend('vbd')
+ ctrl = xend.blkif_create(vm.dom, recreate=recreate, backend=backend)
def fn(ctrl):
- return xend.blkif_dev_create(dom, vdev, mode, segment, recreate=recreate)
+ return xend.blkif_dev_create(vm.dom, vdev, mode, segment, recreate=recreate)
ctrl.addCallback(fn)
return ctrl
self.console = None
self.devices = {}
self.device_index = {}
+ self.device_backends = {}
self.configs = []
self.info = None
self.ipaddrs = []
if c in '_-.': continue
if c in string.ascii_letters: continue
raise VmError('invalid vm name')
- # See comment in XendDomain constructor.
- xd = get_component('xen.xend.XendDomain')
- dominfo = xd.domain_exists(name)
+ dominfo = domain_exists(name)
# When creating or rebooting, a domain with my name should not exist.
# When restoring, a domain with my name will exist, but it should have
# my domain id.
self.devices = {}
self.device_index = {}
+ self.device_backends = {}
self.configs = []
self.ipaddrs = []
self.restart_state = None
return d
+ def configure_device_backend(self, type, sxpr):
+ """Configure the backend domain to use for devices of a given type.
+
+ @param type: device type
+ @param sxpr: config
+ @raise: VmError if the domain id is missing
+ @raise: VmError if the domain does not exist
+ """
+ dom = sxp.child_value(sxpr, 'domain')
+ if dom is None:
+ raise VmError('missing backend domain')
+ dominfo = domain_exists(dom)
+ if dominfo is None:
+ raise VmError('invalid backend domain:' + dom)
+ self.device_backends[type] = dominfo.dom
+
+ def get_device_backend(self, type):
+ return self.device_backends.get(type, 0)
+
def configure_backends(self):
- """Set configuration flags if the vm is a backend for netif of blkif.
+ """Set configuration flags if the vm is a backend for netif or blkif.
+ Configure the backends to use for vbd and vif if specified.
"""
for c in sxp.children(self.config, 'backend'):
- name = sxp.name(sxp.child0(c))
+ v = sxp.child0(c)
+ name = sxp.name(v)
if name == 'blkif':
self.blkif_backend = 1
elif name == 'netif':
self.netif_backend = 1
+ elif name == 'vbd':
+ self.configure_device_backend('vbd', v)
+ elif name == 'vif':
+ self.configure_device_backend('vif', v)
else:
raise VmError('invalid backend type:' + str(name))
raise VmError('vif: vif in netif backend domain')
vif = vm.next_device_index('vif')
vmac = sxp.child_value(val, "mac")
- xend.netif_create(vm.dom, recreate=vm.recreate)
+ backend = vm.get_device_backend('vif')
+ xend.netif_create(vm.dom, recreate=vm.recreate, backend=backend)
log.debug("Creating vif dom=%d vif=%d mac=%s", vm.dom, vif, str(vmac))
defer = xend.netif_dev_create(vm.dom, vif, val, recreate=vm.recreate)
def fn(id):
raise VmError('vbd: Missing dev')
mode = sxp.child_value(val, 'mode', 'r')
log.debug("Creating vbd dom=%d uname=%s dev=%s", vm.dom, uname, dev)
- defer = make_disk(vm.dom, uname, dev, mode, vm.recreate)
+ defer = make_disk(vm, uname, dev, mode, vm.recreate)
def fn(vbd):
vbd.dev = dev
vbd.uname = uname
"""
return self.blkifCF.getControlDomain()
- def blkif_create(self, dom, recreate=0):
+ def blkif_create(self, dom, recreate=0, backend=0):
"""Create a block device interface controller.
Returns Deferred
"""
- d = self.blkifCF.createInstance(dom, recreate=recreate)
+ d = self.blkifCF.createInstance(dom, recreate=recreate, backend=backend)
return d
def blkifs(self):
"""
return self.netifCF.getControlDomain()
- def netif_create(self, dom, recreate=0):
+ def netif_create(self, dom, recreate=0, backend=0):
"""Create a network interface controller.
"""
- return self.netifCF.createInstance(dom, recreate=recreate)
+ return self.netifCF.createInstance(dom, recreate=recreate, backend=backend)
def netifs(self):
return [ x.sxpr() for x in self.netifCF.getInstances() ]
fn=set_bool, default=0,
use="Make the domain a network interface backend.")
+gopts.var('vbd_backend', val='DOM',
+ fn=set_value, default=None,
+ use='Set the domain to use for the vbd backend.')
+
+gopts.var('vif_backend', val='DOM',
+ fn=set_value, default=None,
+ use='Set the domain to use for the vif backend.')
+
gopts.var('disk', val='phy:DEV,VDEV,MODE',
fn=append_value, default=[],
use="""Add a disk device to a domain. The physical device is DEV,
config.append(['backend', ['blkif']])
if vals.netif:
config.append(['backend', ['netif']])
+ if vals.vbd_backend:
+ config.append(['backend', ['vbd', ['dom', vals.vbd_backend]]])
+ if vals.vif_backend:
+ config.append(['backend', ['vif', ['dom', vals.vif_backend]]])
if vals.restart:
config.append(['restart', vals.restart])
if vals.console: